# We want to preserve areas in segments that are not covered by section headers.
# This test shows that we do this for areas at the start of a segment, between
# sections in a segment, and after all sections in a segment.
# To create inputs with arbitrary data in segments, not covered by sections, we
# use yaml2obj to create segments with sections covering all areas, then remove
# some sections in those segments, and finally write over the areas of the
# removed sections using python.

# blob* sections are the sections that will be removed to create unlabelled
# areas and then overwritten with data to show we preserve the data.

# RUN: yaml2obj %s -o %t.base
# RUN: llvm-objcopy %t.base %t.stripped --regex -R blob.*
# Show that the removal leaves the bytes as zeroes, as desired, for all our
# test cases.
# RUN: od -t x1 -j 0x2000 -N 28 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK1 -DPATTERN="00 00 00 00"
# RUN: od -t x1 -j 0x2100 -N 12 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK2 -DPATTERN="00 00 00 00"
# RUN: od -t x1 -j 0x2200 -N 4  %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK3 -DPATTERN="00 00 00 00"
# RUN: od -t x1 -j 0x2300 -N 12 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK4 -DPATTERN="00 00 00 00"
# RUN: od -t x1 -j 0x3000 -N 68 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK5 -DPATTERN="00 00 00 00"
# RUN: od -t x1 -j 0x4000 -N 60 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK6 -DPATTERN="00 00 00 00"
# RUN: od -t x1 -j 0x5000 -N 60 %t.stripped | FileCheck %s --ignore-case --check-prefix=CHECK7 -DPATTERN="00 00 00 00"

# RUN: cp %t.stripped %t.in
# RUN: echo "with open('%/t.in', 'rb+') as input:"                                 > %t.py
# RUN: echo "  for offset in ["                                                   >> %t.py
# RUN: echo "   0x2000, 0x2008, 0x200C, 0x2018, 0x2104, 0x2300,"                  >> %t.py
# RUN: echo "   0x3008, 0x3010, 0x3018, 0x3020, 0x3028, 0x302C, 0x3034, 0x303C,"  >> %t.py
# RUN: echo "   0x4000, 0x4008, 0x4010, 0x4014, 0x401C, 0x4024, 0x4034,"          >> %t.py
# RUN: echo "   0x5000, 0x5008, 0x5010, 0x501C, 0x5024, 0x502C, 0x5030, 0x5038]:" >> %t.py
# RUN: echo "    input.seek(offset)"                                              >> %t.py
# RUN: echo "    input.write(bytearray.fromhex('DEADBEEF'))"                      >> %t.py
# RUN: %python %t.py
# RUN: llvm-objcopy %t.in %t.out
# RUN: od -t x1 -j 0x2000 -N 28 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK1 -DPATTERN="de ad be ef"
# RUN: od -t x1 -j 0x2100 -N 12 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK2 -DPATTERN="de ad be ef"
# RUN: od -t x1 -j 0x2200 -N 4  %t.out | FileCheck %s --ignore-case --check-prefix=CHECK3 -DPATTERN="de ad be ef"
# RUN: od -t x1 -j 0x2300 -N 12 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK4 -DPATTERN="de ad be ef"
# RUN: od -t x1 -j 0x3000 -N 68 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK5 -DPATTERN="de ad be ef"
# RUN: od -t x1 -j 0x4000 -N 60 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK6 -DPATTERN="de ad be ef"
# RUN: od -t x1 -j 0x5000 -N 60 %t.out | FileCheck %s --ignore-case --check-prefix=CHECK7 -DPATTERN="de ad be ef"

# CHECK1:      [[PATTERN]] 11 22 33 44 [[PATTERN]] [[PATTERN]]
# CHECK1-NEXT: 00 00 00 00 55 66 77 88 [[PATTERN]]
# CHECK2:      99 00 aa bb [[PATTERN]] cc dd ee ff
# CHECK3:      fe fe fe fe
# CHECK4:      [[PATTERN]] 00 00 00 00 00 00 00 00
# CHECK5:      ff ff ee ee dd dd cc cc [[PATTERN]] bb bb aa aa
# CHECK5-NEXT: [[PATTERN]] 00 00 99 99 [[PATTERN]] 88 88 77 77
# CHECK5-NEXT: [[PATTERN]] 66 66 55 55 [[PATTERN]] [[PATTERN]]
# CHECK5-NEXT: 44 44 33 33 [[PATTERN]] 22 22 11 11 [[PATTERN]]
# CHECK5-NEXT: 00 11 22 33
# CHECK6:      [[PATTERN]] 44 55 66 77 [[PATTERN]] 88 99 aa bb
# CHECK6-NEXT: [[PATTERN]] [[PATTERN]] cc dd ee ff [[PATTERN]]
# CHECK6-NEXT: ff ee dd cc [[PATTERN]] bb aa 99 88 77 66 55 44
# CHECK6-NEXT: 33 22 11 00 [[PATTERN]] 11 11 11 11
# CHECK7:      [[PATTERN]] 12 34 56 78 [[PATTERN]] 90 ab cd ef
# CHECK7-NEXT: [[PATTERN]] fe dc ba 09 87 65 43 21 [[PATTERN]]
# CHECK7-NEXT: 22 22 22 22 [[PATTERN]] 33 33 33 33 [[PATTERN]]
# CHECK7-NEXT: [[PATTERN]] 44 44 44 44 [[PATTERN]]

--- !ELF
FileHeader:
  Class:   ELFCLASS64
  Data:    ELFDATA2LSB
  Type:    ET_EXEC
  Machine: EM_X86_64
Sections:
  - Name: blob1
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x2000
    AddressAlign: 0x2000
  - Name: section1
    Type: SHT_PROGBITS
    Address: 0x2004
    Content: '11223344'
  - Name: blob2
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x2008
  - Name: section2
    Type: SHT_NOBITS
    Size: 4
    Address: 0x200C
  - Name: blob3
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x2010
  - Name: section3
    Type: SHT_PROGBITS
    Content: '55667788'
    Address: 0x2014
  - Name: blob4
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x2018
  - Name: section4
    Type: SHT_PROGBITS
    Content: '9900aabb'
    Address: 0x2100
    AddressAlign: 0x100
  - Name: blob5
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x2104
  - Name: section5
    Type: SHT_PROGBITS
    Address: 0x2108
    Content: 'ccddeeff'
  - Name: section6
    Type: SHT_PROGBITS
    Content: 'fefefefe'
    Address: 0x2200
    AddressAlign: 0x100
  - Name: blob6
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x2300
    AddressAlign: 0x100
  - Name: sectionA
    Type: SHT_PROGBITS
    Content: 'ffffeeee'
    Address: 0x3000
    AddressAlign: 0x1000
  - Name: sectionB
    Type: SHT_PROGBITS
    Content: 'ddddcccc'
    Address: 0x3004
  - Name: blobA
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x3008
  - Name: sectionC
    Type: SHT_PROGBITS
    Content: 'bbbbaaaa'
    Address: 0x300C
  - Name: blobB
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x3010
  - Name: sectionD
    Type: SHT_PROGBITS
    Content: '00009999'
    Address: 0x3014
  - Name: blobC
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x3018
  - Name: sectionE
    Type: SHT_PROGBITS
    Content: '88887777'
    Address: 0x301C
  - Name: blobD
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x3020
  - Name: sectionF
    Type: SHT_PROGBITS
    Content: '66665555'
    Address: 0x3024
  - Name: blobE
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x3028
  - Name: blobF
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x302C
  - Name: sectionG
    Type: SHT_PROGBITS
    Content: '44443333'
    Address: 0x3030
  - Name: blobG
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x3034
  - Name: sectionH
    Type: SHT_PROGBITS
    Content: '22221111'
    Address: 0x3038
  - Name: blobH
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x303C
  - Name: sectionI
    Type: SHT_PROGBITS
    Content: '00112233'
    Address: 0x3040
  - Name: blobz
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x4000
    AddressAlign: 0x1000
  - Name: sectionz
    Type: SHT_PROGBITS
    Content: '44556677'
    Address: 0x4004
  - Name: bloby
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x4008
  - Name: sectiony
    Type: SHT_PROGBITS
    Content: '8899aabb'
    Address: 0x400C
  - Name: blobx
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x4010
  - Name: blobw
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x4014
  - Name: sectionx
    Type: SHT_PROGBITS
    Content: 'ccddeeff'
    Address: 0x4018
  - Name: blobv
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x401C
  - Name: sectionw
    Type: SHT_PROGBITS
    Content: 'ffeeddcc'
    Address: 0x4020
  - Name: blobu
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x4024
  - Name: sectionv
    Type: SHT_PROGBITS
    Content: 'bbaa9988'
    Address: 0x4028
  - Name: sectionu
    Type: SHT_PROGBITS
    Content: '77665544'
    Address: 0x402C
  - Name: sectiont
    Type: SHT_PROGBITS
    Content: '33221100'
    Address: 0x4030
  - Name: blobt
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x4034
  - Name: sections
    Type: SHT_PROGBITS
    Content: '11111111'
    Address: 0x4038
  - Name: bloba
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x5000
    AddressAlign: 0x1000
  - Name: sectiona
    Type: SHT_PROGBITS
    Content: '12345678'
    Address: 0x5004
  - Name: blobb
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x5008
  - Name: sectionb
    Type: SHT_PROGBITS
    Content: '90abcdef'
    Address: 0x500C
  - Name: blobc
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x5010
  - Name: sectionc
    Type: SHT_PROGBITS
    Content: 'fedcba09'
    Address: 0x5014
  - Name: sectiond
    Type: SHT_PROGBITS
    Content: '87654321'
    Address: 0x5018
  - Name: blobd
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x501C
  - Name: sectione
    Type: SHT_PROGBITS
    Content: '22222222'
    Address: 0x5020
  - Name: blobe
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x5024
  - Name: sectionf
    Type: SHT_PROGBITS
    Content: '33333333'
    Address: 0x5028
  - Name: blobf
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x502C
  - Name: blobg
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x5030
  - Name: sectiong
    Type: SHT_PROGBITS
    Content: '44444444'
    Address: 0x5034
  - Name: blobh
    Type: SHT_PROGBITS
    Content: 'abbababa'
    Address: 0x5038
ProgramHeaders:
  # First segment has unlabelled space at start and end.
  - Type:     0x6ABCDEF0 # Non-specific segment type.
    VAddr:    0x2000
    Align:    0x2000
    FirstSec: blob1
    LastSec:  blob4
  # Second segment has sections at start and end.
  - Type:     0x6ABCDEF0
    VAddr:    0x2100
    Align:    0x100
    FirstSec: section4
    LastSec:  section5
  # Third segment is all covered by a section.
  - Type:     0x6ABCDEF0
    VAddr:    0x2200
    Align:    0x100
    FirstSec: section6
    LastSec:  section6
  # Fourth segment has no sections (after removing blob headers).
  - Type:     0x6ABCDEF0
    VAddr:    0x2300
    Align:    0x100
    FirstSec: blob6
    LastSec:  blob6
  # Fifth segment is empty.
  - Type:   0x6ABCDEF0
    VAddr:  0x2308
    Offset: 0x2308
  # The next few segments test behaviour of fully nested segments.
  # Sixth segment is the "parent" segment.
  - Type:     0x6ABCDEF0
    VAddr:    0x3000
    Align:    0x1000
    FirstSec: sectionA
    LastSec:  sectionI
  # Seventh segment is empty and nested.
  - Type:   0x6ABCDEF0
    VAddr:  0x3002
    Offset: 0x3002
  # Eighth segment contains only a section and is nested.
  - Type:     0x6ABCDEF0
    VAddr:    0x3004
    FirstSec: sectionB
    LastSec:  sectionB
  # Ninth segment contains only unlabelled space and is nested.
  - Type:     0x6ABCDEF0
    VAddr:    0x3008
    FirstSec: blobA
    LastSec:  blobA
  # Tenth segment contains two sections with space between and is nested.
  - Type:     0x6ABCDEF0
    VAddr:    0x300C
    FirstSec: sectionC
    LastSec:  sectionD
  # Eleventh segment contains two sections with space between and at ends and is nested.
  - Type:     0x6ABCDEF0
    VAddr:    0x3018
    FirstSec: blobC
    LastSec:  blobE
  # Twelfth segment contains one section with space at ends adjacent to space in parent segment.
  - Type:     0x6ABCDEF0
    VAddr:    0x302E
    Offset:   0x302E
    FileSize: 8
    FirstSec: sectionG
    LastSec:  sectionG
  # Thirteenth segment contains overlaps sections at either end in parent segment.
  - Type:     0x6ABCDEF0
    VAddr:    0x303A
    Offset:   0x303A
    FileSize: 0x8
    FirstSec: blobH
    LastSec:  blobH

  # The next batch of segments are segments that only partially overlap other segments.

  # Segment14: |-unlabelled-|-Sec-|
  # Segment15:           |--|-Sec-|-unlabelled-|
  - Type:     0x6ABCDEF0
    VAddr:    0x4000
    FirstSec: blobz
    LastSec:  sectionz
  - Type:     0x6ABCDEF0
    VAddr:    0x4002
    Offset:   0x4002
    FirstSec: sectionz
    LastSec:  bloby

  # Segment16: |-Sec-|--|
  # Segment17:    |--|----unlabelled---|
  - Type:     0x6ABCDEF0
    VAddr:    0x400C
    FileSize: 6
    FirstSec: sectiony
    LastSec:  sectiony
  - Type:     0x6ABCDEF0
    VAddr:    0x400E
    Offset:   0x400E
    FirstSec: blobx
    LastSec:  blobx

  # Segment18: |-unlabelled-|-Sec-|
  # Segment19:              |-Sec-|-unlabelled-|
  - Type:     0x6ABCDEF0
    VAddr:    0x4014
    FirstSec: blobw
    LastSec:  sectionx
  - Type:     0x6ABCDEF0
    VAddr:    0x4018
    FirstSec: sectionx
    LastSec:  blobv

  # Segment20: |-Sec-|
  # Segment21:    |--|-unlabelled-|-Sec-|
  - Type:     0x6ABCDEF0
    VAddr:    0x4020
    FirstSec: sectionw
    LastSec:  sectionw

  - Type:   0x6ABCDEF0
    VAddr:  0x4022
    Offset: 0x4022
    FirstSec: blobu
    LastSec:  sectionv

  # Segment22: |-Sec-|
  # Segment23:    |--|-Sec-|
  - Type:     0x6ABCDEF0
    VAddr:    0x402C
    FirstSec: sectionu
    LastSec:  sectionu
  - Type:     0x6ABCDEF0
    VAddr:    0x402E
    Offset:   0x402E
    FirstSec: sectiont
    LastSec:  sectiont

  # Segment24: |-unlabelled-|--|
  # Segment25:              |--Sec--|
  - Type:     0x6ABCDEF0
    VAddr:    0x4034
    FileSize: 6
    FirstSec: blobt
    LastSec:  blobt
  - Type:     0x6ABCDEF0
    VAddr:    0x4038
    FirstSec: sections
    LastSec:  sections

  # The next batch of segments represent groups of three nested/overlapping segments,
  # with one parent segment containing two overlapping segments.

  # Segment26: |-unlabelled-|-Sec-|-unlabelled-|
  # Segment27: |------------|--|
  # Segment28:              |-Sec-|------------|
  - Type:     0x6ABCDEF0
    VAddr:    0x5000
    Align:    0x1000
    FirstSec: bloba
    LastSec:  blobb
  - Type:     0x6ABCDEF0
    VAddr:    0x5000
    FileSize: 6
    FirstSec: bloba
    LastSec:  bloba
  - Type:     0x6ABCDEF0
    VAddr:    0x5004
    FirstSec: sectiona
    LastSec:  blobb

  # Segment29: |-Sec-|-unlabelled-|-Sec-|
  # Segment30: |-Sec-|--------|
  # Segment31:          |---------|-Sec-|
  - Type:     0x6ABCDEF0
    VAddr:    0x500C
    FirstSec: sectionb
    LastSec:  sectionc
  - Type:     0x6ABCDEF0
    VAddr:    0x500C
    FileSize: 7
    FirstSec: sectionb
    LastSec:  sectionb
  - Type:     0x6ABCDEF0
    VAddr:    0x5011
    Offset:   0x5011
    FirstSec: sectionc
    LastSec:  sectionc

  # Segment32: |-Sec-|-unlabelled-|-Sec-|
  # Segment33: |-Sec-|------------|
  # Segment34:       |------------|-Sec-|
  - Type:    0x6ABCDEF0
    VAddr:   0x5018
    FirstSec: sectiond
    LastSec:  sectione
  - Type:     0x6ABCDEF0
    VAddr:    0x5018
    FirstSec: sectiond
    LastSec:  blobd
  - Type:     0x6ABCDEF0
    VAddr:    0x501C
    FirstSec: blobd
    LastSec:  sectione

  # Segment35: |-unlabelled-|-Sec-|-unlabelled-|
  # Segment36: |------------|-Sec-|
  # Segment37:              |-Sec-|------------|
  - Type:     0x6ABCDEF0
    VAddr:    0x5024
    FirstSec: blobe
    LastSec:  blobf
  - Type:     0x6ABCDEF0
    VAddr:    0x5024
    FirstSec: blobe
    LastSec:  sectionf
  - Type:     0x6ABCDEF0
    VAddr:    0x5028
    FirstSec: sectionf
    LastSec:  blobf

  # Segment38: |-unlabelled-|-Sec-|-unlabelled-|
  # Segment39: |------------|---|
  # Segment40:                |---|------------|
  - Type:     0x6ABCDEF0
    VAddr:    0x5030
    FirstSec: blobg
    LastSec:  blobh
  - Type:     0x6ABCDEF0
    VAddr:    0x5030
    FileSize: 7
    FirstSec: blobg
    LastSec:  blobg
  - Type:     0x6ABCDEF0
    VAddr:    0x5035
    Offset:   0x5035
    FirstSec: blobh
    LastSec:  blobh
